package cn.pdx.elec.service.impl;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cn.pdx.elec.dao.ElecTextDao;
import cn.pdx.elec.domain.ElecText;
import cn.pdx.elec.service.ElecTextService;
import cn.pdx.elec.web.form.ElecTextForm;

/**
 *  @Repository 、@Service 和 @Controller 
           在目前的 Spring 版本中，这 3 个注释和 @Component 是等效的，但是从注释类的命名上，3 个注释分别和持久层 、业务层 和控制层 相对应。
 * 
 *@Transactional(readOnly=true),定义类方法的事务为只读,不能写入数据库
 * 业务类方法只有增、删、改为可写,其他事务都为只读
 * @author 彭定旭
 */
@Transactional(readOnly=true)
@Service(ElecTextService.SERVICE_NAME)   //spring不用配置
public class ElecTextServiceImpl implements ElecTextService {
   
	//业务层调用dao层;用注解
	@Resource(name=ElecTextDao.SERVICE_NAME)
	private ElecTextDao elecTextDao;
	
	
	/**
	 * 规范注释例子
	 * @Name:saveElecText
	 * @Description:保存ElecText对象
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-3-25(创建日期)
	 * @parameters:ElecText elecText(elecText对象]
	 * @return:elecText对象
	 */
	/**
	 * @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)
	 * 定义方法的事务可写，可以覆盖了类的事务 readOnly=true
	 */
	@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)
	public void saveElecText(ElecText elecText) {
		
    	elecTextDao.save(elecText);
		
	}

	/**
	 * @Name:findCollectionByConditionNoPage
	 * @Description:使用查询条件查询列表集合（不分页）
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-3-25(创建日期)
	 * @parameters:ElecTextForm elecTextForm VO对象
	 * @return:List<ElecText> 列表集合,这个ElecTextServiceImpl查询的是ElecText对象的业务,其他业务也可以调用底层方法查询
	 */
	public List<ElecText> findCollectionByConditionNoPage(ElecTextForm elecTextForm) {
		
		/**
		 * 组织HQL语句的where 条件
		 *  select * from elec_text o where 1=1         放置Dao层【where 1=1是为了条件都可以用and连接】
			and o.textName like '%张%'             放置service层
			and o.textRemark like '%测%'
			order by o.textDate desc,o.textName asc
		 */
		
		String hqlWhere="";
		
		//定义数组存放参数 ？
		List<String> paramsList=new ArrayList<String>();
		
		if(elecTextForm!=null && StringUtils.isNotBlank(elecTextForm.getTextName()))
		{
			hqlWhere +=" and o.textName like ? ";
			paramsList.add("%"+elecTextForm.getTextName()+"%");
		}
		if(elecTextForm!=null && StringUtils.isNotBlank(elecTextForm.getTextRemark()))
		{ 
			//妹的，这里写成了o.getTextRemark,擦。害我查了那么久
			hqlWhere +="and o.textRemark like ? ";
			paramsList.add("%"+elecTextForm.getTextRemark()+"%");
		}
		
		//集合对象变数组
		Object [] params=paramsList.toArray();
		/**
		 * 组织排序
		 * order by o.textDate desc,o.textName asc
		 */
		LinkedHashMap<String, String> orderby=new LinkedHashMap<String, String>();
		orderby.put("o.textDate", "desc");
		orderby.put("o.textName", "asc");
		//查询列表
		System.out.println("2222222222222");
		System.out.println(hqlWhere);
		
		List<ElecText> list = elecTextDao.findCollectionByConditionNoPage(hqlWhere,params,orderby);
		
		System.out.println("33333333333333");
		
		for(int i=0;list!=null && i<list.size();i++)
		{
			ElecText elecText=list.get(i);
			System.out.println(elecText.getTextName()+"   "+elecText.getTextRemark());
		}
		return null;
	}

	
}
